/*
 * @Author: 栗佳琪 2745602478@qq.com
 * @Date: 2025-06-27 10:17:55
 * @LastEditors: 栗佳琪 2745602478@qq.com
 * @LastEditTime: 2025-06-27 16:26:34
 * @FilePath: \测试\Calculator.java
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Font;

//继承JFrame为了直接复用seing框架中窗口管理能力
//为了子类可以直接调用JFrame 公开的方法
//ApplicationListener是java事件中处理机制的核心部分
//为了建立计算器组件和用户操作之间的响应机制
public class Calculator extends JFrame implements ActionListener{
    //声明界面组件
    //上下两个容器面板 文本框区域 按钮区域
    private JPanel north,center;
    //文本框 显示计算过程或者结果
    private JTextField field;
    //按钮
    private JButton[] btns;

    //初始化窗口 - 构造器 构造方法
    public Calculator(){
        setTitle("计算器");
        setSize(700,700);
        //设置窗口关闭程序
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        //初始化窗口组件
        initComponent();
        //设置窗口居中显示
        setLocationRelativeTo(null);
        //设置窗口显示
        setVisible(true);
  
    }
          private void initComponent() {
            //System.out.println("initComponent")
            //创建面板容器
            //声明界面组件
        //上下两个容器面板 文本框区域 按钮区域
        north = new JPanel();
        //文本框 显示计算过程或者结果
        center = new JPanel();
        field = new JTextField();
        //设置输入框大小 
        field.setPreferredSize(new Dimension(700,150));
        //禁用文字输入 禁止通过电脑键盘输入编辑
        field.setEditable(false);
        //设置输入框文字大小
        field.setFont(new Font("SansSerif",Font.BOLD,35));
        //按钮文本内容5行4列
        //JButton[] btns
        String[] str = new String[]{
            "7", "8", "9", "+",
            "4", "5", "6", "-",
            "1", "2", "3", "×",
            "0", ".", "=", "÷",
            "C", "B", "T", "S"
        };
        //按钮数组
        btns = new JButton[str.length];
        for(int i = 0;i<btns.length;i++){
            btns[i] = new JButton(str[i]);
            btns[i].setFont(new Font("SansSerif",Font.BOLD,35));

        }

        //将组件放在窗口中
        //设置布局管理器
        //顶部面板用BorderLayout 边界布局
        north.setLayout(new BorderLayout());
        //center 中间面板 使用5行4列的网格布局
        center.setLayout(new GridLayout(5,4));
        //文本框 添加到north 顶部面板 使用BorderLayout 居中
        north.add(field,BorderLayout.CENTER);
        //按钮添加到center面板 增强for循环
        for(JButton btn:btns){
            center.add(btn);//通过遍历将所有按钮添加到center面板
            //将center面板添加到窗口中 
        }
        
        add(north,BorderLayout.NORTH);
        //将north顶部面板添加到窗口中
        add (center);

        //绑定按钮的监听事件
        for(JButton btn : btns){
            btn.addActionListener(this);
        }
        }
    
    //实现接口中的抽象方法 处理事件
    //处理按键文本
    private void setBtnText(String text){
        switch(text){
            case"C":
            System.out.println("C");
            break;
            case"T":
            System.out.println("T");
            break;
            case"S":
            System.out.println("S");
            break;
            case"B":
            System.out.println("B");
            break;
            case"+":
            System.out.println("+");
            break;
            case"-":
            System.out.println("-");
            break;
            case"×":
            System.out.println("×");
            break;
            case"÷":
            System.out.println("÷");
            break;
            case"=":
            System.out.println("=");
            break;
            default:
        //System.out.printl("setBtnText:"+text);
        //按下数字键 要把文字放到输入框中
        //field.setText(text);
        String oldText = field.getText();
        field.setText(oldText + text);
        break;
        }
    }
    @Override
    public void actionPerformed(ActionEvent a){
        //此处可以捕获到ActionListener 监听的事件
        System.out.println(a.getSource());
        //获取被点击的按钮 或者按钮的文字
        Object source = a.getSource();
        if(source instanceof JButton){
            JButton btn = (JButton) source;
            String text = btn.getText();
            //System.out.println(text);
            //处理对应
            setBtnText(text);
        }
    } 


    public static void main(String[] args){
        //System.out.println("hello,Calculator");
        //创建类对象-线程不安全
        //new Calculator();
        //是Java Swing 开发中确保线程安全
        SwingUtilities.invokeLater(Calculator::new);
    }


}